package co.edu.usbcali.sgi.presentation.backEndBeans;

import co.edu.usbcali.sgi.exceptions.*;
import co.edu.usbcali.sgi.modelo.*;
import co.edu.usbcali.sgi.modelo.dto.AdministradorDTO;
import co.edu.usbcali.sgi.presentation.businessDelegate.BusinessDelegatorView;
import co.edu.usbcali.sgi.utilities.*;

import com.icesoft.faces.async.render.RenderManager;
import com.icesoft.faces.async.render.Renderable;
import com.icesoft.faces.component.ext.HtmlCommandButton;
import com.icesoft.faces.component.ext.HtmlInputText;
import com.icesoft.faces.component.ext.HtmlSelectOneMenu;
import com.icesoft.faces.component.selectinputdate.SelectInputDate;
import com.icesoft.faces.context.DisposableBean;
import com.icesoft.faces.webapp.xmlhttp.FatalRenderingException;
import com.icesoft.faces.webapp.xmlhttp.PersistentFacesState;
import com.icesoft.faces.webapp.xmlhttp.RenderingException;
import com.icesoft.faces.webapp.xmlhttp.TransientRenderingException;
import com.sun.org.apache.commons.collections.BagUtils;

import java.math.BigDecimal;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;
import java.util.Vector;

import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;


public class AdministradorView extends DataSource implements Renderable,
DisposableBean {
	private HtmlSelectOneMenu cmbEstCodigo_Estado;
	private HtmlInputText txtPerCedula;
	//    private HtmlInputText txtAdmCod;
	private List<SelectItem> listTipoDocumento = new ArrayList<SelectItem>();
	private HtmlCommandButton btnSave;
	private HtmlCommandButton btnModify;
	private HtmlCommandButton btnDelete;
	private HtmlCommandButton btnClear;
	private boolean renderDataTable;
	private boolean flag = true;
	private RenderManager renderManager;
	private PersistentFacesState state = PersistentFacesState.getInstance();
	private List<Administrador> administrador;
	private List<AdministradorDTO> administradorDTO;
	private boolean btnErrorf = false;
	private HtmlCommandButton btnUsu;
	private boolean panelVisible = false;

	public void action_abrir(ActionEvent e){
		panelVisible=true;
	}

	public boolean isPanelVisible() {
		return panelVisible;
	}

	public void setPanelVisible(boolean panelVisible) {
		this.panelVisible = panelVisible;
	}

	public void action_retorno(ActionEvent e){
		btnErrorf=!btnErrorf;

	}

	public AdministradorView() {
		super("");
	}
	public String action_cerrar2(){
		btnErrorf = false;
		return "";
	}



	public HtmlCommandButton getBtnUsu() {
		return btnUsu;
	}
	public void setBtnUsu(HtmlCommandButton btnUsu) {
		this.btnUsu = btnUsu;
	}
	public boolean isBtnErrorf() {
		return btnErrorf;
	}

	public void setBtnErrorf(boolean btnErrorf) {
		this.btnErrorf = btnErrorf;
	}


	private HtmlInputText txtPerCorreo;
	private HtmlInputText txtPerPrimerApelli;
	private HtmlInputText txtPerPrimerNom;
	private HtmlInputText txtPerSegundoApelli;
	private HtmlInputText txtPerSegundoNom;
	private HtmlInputText txtPerTelefono;
	private HtmlSelectOneMenu cmbTipoDocumento;


	public HtmlInputText getTxtPerCorreo() {
		return txtPerCorreo;
	}

	public void setTxtPerCorreo(HtmlInputText txtPerCorreo) {
		this.txtPerCorreo = txtPerCorreo;
	}

	public HtmlInputText getTxtPerPrimerApelli() {
		return txtPerPrimerApelli;
	}

	public void setTxtPerPrimerApelli(HtmlInputText txtPerPrimerApelli) {
		this.txtPerPrimerApelli = txtPerPrimerApelli;
	}

	public HtmlInputText getTxtPerPrimerNom() {
		return txtPerPrimerNom;
	}

	public void setTxtPerPrimerNom(HtmlInputText txtPerPrimerNom) {
		this.txtPerPrimerNom = txtPerPrimerNom;
	}

	public HtmlInputText getTxtPerSegundoApelli() {
		return txtPerSegundoApelli;
	}

	public void setTxtPerSegundoApelli(HtmlInputText txtPerSegundoApelli) {
		this.txtPerSegundoApelli = txtPerSegundoApelli;
	}

	public HtmlInputText getTxtPerSegundoNom() {
		return txtPerSegundoNom;
	}

	public void setTxtPerSegundoNom(HtmlInputText txtPerSegundoNom) {
		this.txtPerSegundoNom = txtPerSegundoNom;
	}

	public HtmlInputText getTxtPerTelefono() {
		return txtPerTelefono;
	}

	public void setTxtPerTelefono(HtmlInputText txtPerTelefono) {
		this.txtPerTelefono = txtPerTelefono;
	}

	public HtmlSelectOneMenu getCmbTipoDocumento() {
		try {
			List<TipoDocumento> list = BusinessDelegatorView
			.findByCriteriaInTipoDocumento(null, null, null);
			listTipoDocumento.clear();
			listTipoDocumento
			.add(new SelectItem(0, " Seleccione Tipo Documento.. "));

			for (TipoDocumento tipoDocumento : list) {
				listTipoDocumento.add(new SelectItem(tipoDocumento
						.getTdocCod(), tipoDocumento.getTdocNombre()));
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return cmbTipoDocumento;
	}

	private List<SelectItem> listEstado = new ArrayList<SelectItem>();

	public List<SelectItem> getListEstado() {
		return listEstado;
	}

	public void setListEstado(List<SelectItem> listEstado) {
		this.listEstado = listEstado;
	}

	public void setCmbTipoDocumento(HtmlSelectOneMenu cmbTipoDocumento) {
		this.cmbTipoDocumento = cmbTipoDocumento;
	}

	public HtmlSelectOneMenu getCmbEstCodigo_Estado() {
		try {
			List<Estado> list = BusinessDelegatorView.findByCriteriaInEstado(
					null, null, null);
			listEstado.clear();
			listEstado.add(new SelectItem(0, " Seleccione el Estado.. "));

			for (Estado estado : list) {
				listEstado.add(new SelectItem(estado.getEstCod(), estado
						.getEstNombre()));
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return cmbEstCodigo_Estado;
	}

	public void setCmbEstCodigo_Estado(HtmlSelectOneMenu cmbEstCodigoEstado) {
		cmbEstCodigo_Estado = cmbEstCodigoEstado;
	}

	public List<SelectItem> getListTipoDocumento() {
		return listTipoDocumento;
	}

	public void setListTipoDocumento(List<SelectItem> listTipoDocumento) {
		this.listTipoDocumento = listTipoDocumento;
	}

	private HtmlInputText txtPerCelular;

	public HtmlInputText getTxtPerCelular() {
		return txtPerCelular;
	}

	public void setTxtPerCelular(HtmlInputText txtPerCelular) {
		this.txtPerCelular = txtPerCelular;
	}

	public String action_clear() {

		txtPerCelular.setValue(null);
		txtPerCelular.setDisabled(true);
		txtPerCorreo.setValue(null);
		txtPerCorreo.setDisabled(true);
		txtPerPrimerApelli.setValue(null);
		txtPerPrimerApelli.setDisabled(true);
		txtPerPrimerNom.setValue(null);
		txtPerPrimerNom.setDisabled(true);
		txtPerSegundoApelli.setValue(null);
		txtPerSegundoApelli.setDisabled(true);
		txtPerSegundoNom.setValue(null);
		txtPerSegundoNom.setDisabled(true);
		txtPerTelefono.setValue(null);
		txtPerTelefono.setDisabled(true);
		cmbTipoDocumento.setValue(null);
		cmbTipoDocumento.setDisabled(true);
		cmbEstCodigo_Estado.setValue(null);
		cmbEstCodigo_Estado.setDisabled(true);


		//btnSave.setDisabled(true);
		//btnDelete.setDisabled(true);
		//btnModify.setDisabled(true);
		btnClear.setDisabled(false);


		txtPerCedula.setValue(null);
		txtPerCedula.setDisabled(true);
		//        txtAdmCod.setValue(null);
		//        txtAdmCod.setDisabled(false);
		//        

		return "";
	}

	public void listener_txtId(ValueChangeEvent event) {
		if ((event.getNewValue() != null) && !event.getNewValue().equals("")) {
			Administrador entity = null;

			try {
				String perCedula_Persona = new String(txtPerCedula.getValue().toString());
				entity = BusinessDelegatorView.getAdministrador(perCedula_Persona);
			} catch (Exception e) {
				// TODO: handle exception
			}

			if (entity == null) {

				txtPerCelular.setDisabled(false);
				txtPerCorreo.setDisabled(false);
				txtPerPrimerApelli.setDisabled(false);
				txtPerPrimerNom.setDisabled(false);
				txtPerSegundoApelli.setDisabled(false);
				txtPerSegundoNom.setDisabled(false);
				txtPerTelefono.setDisabled(false);
				cmbTipoDocumento.setDisabled(false);
//				cmbEstCodigo_Estado.setDisabled(false);
//
//				cmbEstCodigo_Estado.setDisabled(false);
				txtPerCedula.setDisabled(false);
				//                txtAdmCod.setDisabled(false);
				btnSave.setDisabled(false);
				btnDelete.setDisabled(true);
				btnModify.setDisabled(true);
				btnClear.setDisabled(false);
			} else {
				txtPerTelefono.setDisabled(false);
//				cmbEstCodigo_Estado.setValue(entity.getEstado().getEstCod());
//				cmbEstCodigo_Estado.setDisabled(false);

				txtPerCelular.setValue(entity.getPersona().getPerCelular());
				txtPerCelular.setDisabled(false);

				txtPerCorreo.setValue(entity.getPersona().getPerCorreo());
				txtPerCorreo.setDisabled(false);
				txtPerPrimerApelli.setValue(entity.getPersona().getPerPrimerApellido());
				txtPerPrimerApelli.setDisabled(false);
				txtPerPrimerNom.setValue(entity.getPersona().getPerPrimerNombre());
				txtPerPrimerNom.setDisabled(false);
				txtPerSegundoApelli.setValue(entity.getPersona().getPerSegundoApellido());
				txtPerSegundoApelli.setDisabled(false);
				txtPerSegundoNom.setValue(entity.getPersona().getPerSegundoNombre());
				txtPerSegundoNom.setDisabled(false);
				txtPerTelefono.setValue(entity.getPersona().getPerTelefono());
				txtPerTelefono.setDisabled(false);
				cmbTipoDocumento.setValue(entity.getPersona().getTipoDocumento()
						.getTdocCod());
				cmbTipoDocumento.setDisabled(false);


				cmbTipoDocumento.setDisabled(false);


				cmbEstCodigo_Estado.setValue(entity.getEstado().getEstCod());
				cmbEstCodigo_Estado.setDisabled(false);
				txtPerCedula.setValue(entity.getPersona().getPerCedula());
				txtPerCedula.setDisabled(false);
				//                txtAdmCod.setValue(entity.getAdmCod());
				//                txtAdmCod.setDisabled(true);
				btnSave.setDisabled(true);
				btnDelete.setDisabled(false);
				btnModify.setDisabled(false);
				btnClear.setDisabled(false);
			}
		}
	}


	public String action_save() {
		try {

			//			String admCodigo = txtAdmCod.getValue().toString();
//			String estado = "ACTIVO";
			String cedula = txtPerCedula.getValue().toString();
			String celular = txtPerCelular.getValue().toString();
			String correo = txtPerCorreo.getValue().toString();
			String primerApelli = txtPerPrimerApelli.getValue().toString().toUpperCase();
			String primerNom = txtPerPrimerNom.getValue().toString().toUpperCase();
			String segundoApelli = txtPerSegundoApelli.getValue().toString().toUpperCase();
			String segundoNom = txtPerSegundoNom.getValue().toString().toUpperCase();
			String telefono = txtPerTelefono.getValue().toString();
			String tipoDoc = cmbTipoDocumento.getValue().toString();

			//			if (!Utilities.soloNumerosyLetras(admCodigo)) {
			//				throw new Exception(
			//				"El codigo del  administrador no debe contener caracteres especiales");
			//			}
			//			if (admCodigo.trim().equals("")) {
			//				throw new Exception("Este campo es obligatorio ");
			//			}

			if (tipoDoc.trim().equals("")) {
				throw new Exception("Debe elejir alguna opcion");
			}

//			if (estado.trim().equals("")) {
//				throw new Exception("Este campo es obligatorio");
//			}

			if (!Utilities.soloLetras(primerNom)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if (primerNom.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}

			if (primerApelli.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if (!Utilities.soloLetras(primerApelli)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if (!Utilities.soloLetras(segundoApelli)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if(segundoApelli.trim().equals("")){
				throw new Exception("Este campo es obligatorio");
			}
			if (telefono.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if (!Utilities.soloNumeros(telefono)) {
				throw new Exception("Telefono debe contener solo numeros");
			}

			if (!Utilities.soloNumeros(cedula)) {
				throw new Exception("La cedula debe contener solo numeros");
			}
			if(correo.trim().equals("")){
				throw new Exception("Este campo es obligatorio");
			}
			if (cedula.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if(celular.trim().equals("")){
				throw new Exception("Este campo debe ser olbigatorio");
			}

			if (!Utilities.soloNumeros(celular)) {
				throw new Exception("Celular debe contener solo numeros");
			}
			if (!Utilities.correElectronico(correo)) {
				throw new Exception("Verifique el email");
			}

			BusinessDelegatorView.savePersona(cedula, celular, correo, primerApelli, primerNom, segundoApelli, segundoNom, telefono, "1", tipoDoc);
		

			BusinessDelegatorView.saveAdministrador("1", cedula);
		

			BusinessDelegatorView.saveUsuario(cedula, "1", cedula, "2");
			
			//SendMailTLS.main(correo);
			Email email = new Email();
			email.enviar(correo, "Bienvenido Administrador de la Unidad: " +
					"Su Login es: "+cedula+" y su Password es: " +cedula );
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
			action_clear();


		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_delete() {
		try {
			BusinessDelegatorView.deleteAdministrador(FacesUtils.checkString(
					txtPerCedula));
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modify() {
		try {
			//        	String admCodigo = txtAdmCod.getValue().toString();
			String estado = "ACTIVO";
			String cedula = txtPerCedula.getValue().toString();
			String celular = txtPerCelular.getValue().toString();
			String correo = txtPerCorreo.getValue().toString();
			String primerApelli = txtPerPrimerApelli.getValue().toString().toUpperCase();
			String primerNom = txtPerPrimerNom.getValue().toString().toUpperCase();
			String segundoApelli = txtPerSegundoApelli.getValue().toString().toUpperCase();
			String segundoNom = txtPerSegundoNom.getValue().toString().toUpperCase();
			String telefono = txtPerTelefono.getValue().toString();
			String tipoDoc = cmbTipoDocumento.getValue().toString();

			//			if (!Utilities.soloNumerosyLetras(admCodigo)) {
			//				throw new Exception(
			//				"El codigo del  administrador no debe contener caracteres especiales");
			//			}
			//			if (admCodigo.trim().equals("")) {
			//				throw new Exception("Este campo es obligatorio ");
			//			}

			if (tipoDoc.trim().equals("")) {
				throw new Exception("Debe elejir alguna opcion");
			}

			if (estado.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}

			if (!Utilities.soloLetras(primerNom)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if (primerNom.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}

			if (primerApelli.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if (!Utilities.soloLetras(primerApelli)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if (!Utilities.soloLetras(segundoApelli)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if(segundoApelli.trim().equals("")){
				throw new Exception("Este campo es obligatorio");
			}
			if (telefono.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if (!Utilities.soloNumeros(telefono)) {
				throw new Exception("Telefono debe contener solo numeros");
			}

			if (!Utilities.soloNumeros(cedula)) {
				throw new Exception("La cedula debe contener solo numeros");
			}
			if(correo.trim().equals("")){
				throw new Exception("Este campo es obligatorio");
			}
			if (cedula.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if(celular.trim().equals("")){
				throw new Exception("Este campo debe ser olbigatorio");
			}

			if (!Utilities.soloNumeros(celular)) {
				throw new Exception("Celular debe contener solo numeros");
			}
			if (!Utilities.correElectronico(correo)) {
				throw new Exception("Verifique el email");
			}

			BusinessDelegatorView.updatePersona(cedula, celular, correo, primerApelli, primerNom, segundoApelli, segundoNom, telefono, tipoDoc, estado);
			BusinessDelegatorView
			.updateAdministrador( estado, cedula);
			BusinessDelegatorView.updateUsuario(estado, cedula, cedula, "2");
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
			action_clear();


		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_inactivar() {
		try {

			//			String admCodigo = txtAdmCod.getValue().toString();
			String estado = "INACTIVO";
			String cedula = txtPerCedula.getValue().toString();
			String celular = txtPerCelular.getValue().toString();
			String correo = txtPerCorreo.getValue().toString();
			String primerApelli = txtPerPrimerApelli.getValue().toString().toUpperCase();
			String primerNom = txtPerPrimerNom.getValue().toString().toUpperCase();
			String segundoApelli = txtPerSegundoApelli.getValue().toString().toUpperCase();
			String segundoNom = txtPerSegundoNom.getValue().toString().toUpperCase();
			String telefono = txtPerTelefono.getValue().toString();
			String tipoDoc = cmbTipoDocumento.getValue().toString();

			//			if (!Utilities.soloNumerosyLetras(admCodigo)) {
			//				throw new Exception(
			//				"El codigo del  administrador no debe contener caracteres especiales");
			//			}
			//			if (admCodigo.trim().equals("")) {
			//				throw new Exception("Este campo es obligatorio ");
			//			}
			if (tipoDoc.trim().equals("")) {
				throw new Exception("Debe elejir alguna opcion");
			}

			if (estado.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}

			if (!Utilities.soloLetras(primerNom)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if (primerNom.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}

			if (primerApelli.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if (!Utilities.soloLetras(primerApelli)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if (!Utilities.soloLetras(segundoApelli)) {
				throw new Exception("Este campo debe contener solo letras");
			}
			if(segundoApelli.trim().equals("")){
				throw new Exception("Este campo es obligatorio");
			}
			if (telefono.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if (!Utilities.soloNumeros(telefono)) {
				throw new Exception("Telefono debe contener solo numeros");
			}

			if (!Utilities.soloNumeros(cedula)) {
				throw new Exception("La cedula debe contener solo numeros");
			}
			if(correo.trim().equals("")){
				throw new Exception("Este campo es obligatorio");
			}
			if (cedula.trim().equals("")) {
				throw new Exception("Este campo es obligatorio");
			}
			if(celular.trim().equals("")){
				throw new Exception("Este campo debe ser olbigatorio");
			}

			if (!Utilities.soloNumeros(celular)) {
				throw new Exception("Celular debe contener solo numeros");
			}
			if (!Utilities.correElectronico(correo)) {
				throw new Exception("Verifique el email");
			}
			BusinessDelegatorView.updatePersona(cedula, celular, correo, primerApelli, primerNom, segundoApelli, segundoNom, telefono, tipoDoc, estado);
			BusinessDelegatorView.updateAdministrador( estado, cedula);

			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modifyWitDTO(String admCod, String estCod_Estado,
			String perCedula_Persona) throws Exception {
		try {
			BusinessDelegatorView.updateAdministrador( estCod_Estado,
					perCedula_Persona);
			renderManager.getOnDemandRenderer("AdministradorView")
			.requestRender();
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			//renderManager.getOnDemandRenderer("AdministradorView").requestRender();
			FacesUtils.addErrorMessage(e.getMessage());
			throw e;
		}

		return "";
	}

	public List<Administrador> getAdministrador() {
		if (flag) {
			try {
				administrador = BusinessDelegatorView.getAdministrador();
				flag = false;
			} catch (Exception e) {
				flag = true;
				FacesUtils.addErrorMessage(e.getMessage());
			}
		}

		return administrador;
	}

	public boolean isFlag() {
		return flag;
	}

	public void setAdministrador(List<Administrador> administrador) {
		this.administrador = administrador;
	}

	public boolean isRenderDataTable() {
		try {
			if (flag) {
				if (BusinessDelegatorView.findTotalNumberAdministrador() > 0) {
					renderDataTable = true;
				} else {
					renderDataTable = false;
				}
			}

			flag = false;
		} catch (Exception e) {
			renderDataTable = false;
			e.printStackTrace();
		}

		return renderDataTable;
	}

	public DataModel getData() {
		state = PersistentFacesState.getInstance();

		if (onePageDataModel == null) {
			onePageDataModel = new LocalDataModel(pageSize);
		}

		return onePageDataModel;
	}

	/**
	 * This is where the Object data is retrieved from the database and
	 * returned as a list of objects for display in the UI.
	 */
	 private DataPage<Administrador> getDataPage(int startRow, int pageSize) {
		 // Retrieve the total number of objects from the database.  This
		 // number is required by the DataPage object so the paginator will know
		 // the relative location of the page data.
		 int totalNumberAdministrador = 0;

		 try {
			 totalNumberAdministrador = BusinessDelegatorView.findTotalNumberAdministrador()
			 .intValue();
		 } catch (Exception e) {
			 FacesUtils.addErrorMessage(e.getMessage());
		 }

		 // Calculate indices to be displayed in the ui.
		 int endIndex = startRow + pageSize;

		 if (endIndex > totalNumberAdministrador) {
			 endIndex = totalNumberAdministrador;
		 }

		 try {
			 administrador = BusinessDelegatorView.findPageAdministrador(sortColumnName,
					 sortAscending, startRow, endIndex - startRow);

			 // Remove this Renderable from the existing render groups.
			 //leaveRenderGroups();        			
		 } catch (Exception e) {
			 FacesUtils.addErrorMessage(e.getMessage());
		 }

		 // Add this Renderable to the new render groups.
		 //joinRenderGroups();
		 // Reset the dirtyData flag.
		 onePageDataModel.setDirtyData(false);
		 // This is required when using Hibernate.  If the SessionManager is not
		 // cleared or closed objects are cached and stale objects will show up
		 // in the table.
		 // This way, the detached objects are reread from the database.
		 // This call is not required with Hibernate, which uses a Query Hint
		 // to clear the l2 cache in the DAO.
		 flag = true;

		 return new DataPage<Administrador>(totalNumberAdministrador, startRow,
				 administrador);
	 }

	 public DataModel getDataDTO() {
		 state = PersistentFacesState.getInstance();

		 if (onePageDataModel == null) {
			 onePageDataModel = new LocalDataModelDTO(pageSize);
		 }

		 return onePageDataModel;
	 }

	 /**
	  * This is where the Object data is retrieved from the database and
	  * returned as a list of objects for display in the UI.
	  */
	 private DataPage<AdministradorDTO> getDataPageDTO(int startRow, int pageSize) {
		 // Retrieve the total number of objects from the database.  This
		 // number is required by the DataPage object so the paginator will know
		 // the relative location of the page data.
		 int totalNumberAdministrador = 0;

		 try {
			 totalNumberAdministrador = BusinessDelegatorView.findTotalNumberAdministrador()
			 .intValue();
		 } catch (Exception e) {
			 FacesUtils.addErrorMessage(e.getMessage());
		 }

		 // Calculate indices to be displayed in the ui.
		 int endIndex = startRow + pageSize;

		 if (endIndex > totalNumberAdministrador) {
			 endIndex = totalNumberAdministrador;
		 }

		 try {
			 administrador = BusinessDelegatorView.findPageAdministrador(sortColumnName,
					 sortAscending, startRow, endIndex - startRow);

			 if (Utilities.validationsList(administrador)) {
				 administradorDTO = new ArrayList<AdministradorDTO>();

				 for (Administrador administradorTmp : administrador) {
					 AdministradorDTO administradorDTO2 = new AdministradorDTO();
					 administradorDTO2.setAdmCod(administradorTmp.getAdmCod()
							 .toString());
					 administradorDTO2.setEstCod_Estado((administradorTmp.getEstado()
							 .getEstCod() != null)
							 ? administradorTmp.getEstado().getEstCod().toString()
									 : null);
					 administradorDTO2.setPerCedula_Persona((administradorTmp.getPersona()
							 .getPerCedula() != null)
							 ? administradorTmp.getPersona().getPerCedula().toString()
									 : null);
					 administradorDTO2.setAdministrador(administradorTmp);
					 administradorDTO2.setAdministradorView(this);
					 administradorDTO.add(administradorDTO2);
				 }
			 }

			 // Remove this Renderable from the existing render groups.
			 leaveRenderGroups();
		 } catch (Exception e) {
			 FacesUtils.addErrorMessage(e.getMessage());
		 }

		 // Add this Renderable to the new render groups.
		 joinRenderGroups();
		 // Reset the dirtyData flag.
		 onePageDataModel.setDirtyData(false);
		 // This is required when using Hibernate.  If the SessionManager is not
		 // cleared or closed objects are cached and stale objects will show up
		 // in the table.
		 // This way, the detached objects are reread from the database.
		 // This call is not required with Hibernate, which uses a Query Hint
		 // to clear the l2 cache in the DAO.
		 flag = true;

		 return new DataPage<AdministradorDTO>(totalNumberAdministrador,
				 startRow, administradorDTO);
	 }

	 protected boolean isDefaultAscending(String sortColumn) {
		 return true;
	 }

	 /**
	  * This method is called when a render call is made from the server. Render
	  * calls are only made to views containing an updated record. The data is
	  * marked as dirty to trigger a fetch of the updated record from the
	  * database before rendering takes place.
	  */
	 public PersistentFacesState getState() {
		 onePageDataModel.setDirtyData();

		 return state;
	 }

	 /**
	  * This method is called from faces-config.xml with each new session.
	  */
	 public void setRenderManager(RenderManager renderManager) {
		 this.renderManager = renderManager;
	 }

	 public void renderingException(RenderingException arg0) {
		 if (arg0 instanceof TransientRenderingException) {
		 } else if (arg0 instanceof FatalRenderingException) {
			 // Remove from existing Customer render groups.
			 leaveRenderGroups();
		 }
	 }

	 /**
	  * Remove this Renderable from existing uiCustomerBeans render groups.
	  * OnDemandRenderers are named/created using the underlying Customer Number.
	  */
	 private void leaveRenderGroups() {
		 if (Utilities.validationsList(administradorDTO)) {
			 for (AdministradorDTO administradorTmp : administradorDTO) {
				 renderManager.getOnDemandRenderer("AdministradorView")
				 .remove(this);
			 }
		 }
	 }

	 /**
	  * Add this Renderable to the new uiCustomerBeans render groups.
	  * OnDemandRenderers are named/created using the underlying Customer Number.
	  */
	 private void joinRenderGroups() {
		 if (Utilities.validationsList(administradorDTO)) {
			 for (AdministradorDTO administradorTmp : administradorDTO) {
				 renderManager.getOnDemandRenderer("AdministradorView").add(this);
			 }
		 }
	 }

	 public void dispose() throws Exception {
	 }

	 public RenderManager getRenderManager() {
		 return renderManager;
	 }

	 public void setState(PersistentFacesState state) {
		 this.state = state;
	 }



	 public HtmlInputText getTxtPerCedula() {
		 return txtPerCedula;
	 }

	 public void setTxtPerCedula(HtmlInputText txtPerCedula) {
		 this.txtPerCedula = txtPerCedula;
	 }

	 //	public HtmlInputText getTxtAdmCod() {
	 //        return txtAdmCod;
	 //    }
	 //
	 //    public void setTxtAdmCod(HtmlInputText txtAdmCod) {
	 //        this.txtAdmCod = txtAdmCod;
	 //    }

	 public HtmlCommandButton getBtnSave() {
		 return btnSave;
	 }

	 public void setBtnSave(HtmlCommandButton btnSave) {
		 this.btnSave = btnSave;
	 }

	 public HtmlCommandButton getBtnModify() {
		 return btnModify;
	 }

	 public void setBtnModify(HtmlCommandButton btnModify) {
		 this.btnModify = btnModify;
	 }

	 public HtmlCommandButton getBtnDelete() {
		 return btnDelete;
	 }

	 public void setBtnDelete(HtmlCommandButton btnDelete) {
		 this.btnDelete = btnDelete;
	 }

	 public HtmlCommandButton getBtnClear() {
		 return btnClear;
	 }

	 public void setBtnClear(HtmlCommandButton btnClear) {
		 this.btnClear = btnClear;
	 }

	 public void setRenderDataTable(boolean renderDataTable) {
		 this.renderDataTable = renderDataTable;
	 }

	 public void setFlag(boolean flag) {
		 this.flag = flag;
	 }

	 public List<AdministradorDTO> getAdministradorDTO() {
		 return administradorDTO;
	 }

	 public void setAdministradorDTO(List<AdministradorDTO> administradorDTO) {
		 this.administradorDTO = administradorDTO;
	 }

	 public TimeZone getTimeZone() {
		 return java.util.TimeZone.getDefault();
	 }

	 /**
	  * A special type of JSF DataModel to allow a datatable and datapaginator
	  * to page through a large set of data without having to hold the entire
	  * set of data in memory at once.
	  * Any time a managed bean wants to avoid holding an entire dataset,
	  * the managed bean declares this inner class which extends PagedListDataModel
	  * and implements the fetchData method. fetchData is called
	  * as needed when the table requires data that isn't available in the
	  * current data page held by this object.
	  * This requires the managed bean (and in general the business
	  * method that the managed bean uses) to provide the data wrapped in
	  * a DataPage object that provides info on the full size of the dataset.
	  */
	 private class LocalDataModel extends PagedListDataModel {
		 public LocalDataModel(int pageSize) {
			 super(pageSize);
		 }

		 public DataPage<Administrador> fetchPage(int startRow, int pageSize) {
			 // call enclosing managed bean method to fetch the data
			 return getDataPage(startRow, pageSize);
		 }
	 }

	 private class LocalDataModelDTO extends PagedListDataModel {
		 public LocalDataModelDTO(int pageSize) {
			 super(pageSize);
		 }

		 public DataPage<AdministradorDTO> fetchPage(int startRow, int pageSize) {
			 // call enclosing managed bean method to fetch the data
			 return getDataPageDTO(startRow, pageSize);
		 }
	 }
}
